Dans le cadre des formations “Humanités numériques” EPHE-PSL

Introduction à l’encodage TEI

Enseignement : Vanessa Bigot Juloux (EPHE-PSL, Andrews University)



Sommaire

Séance du 17 avril 2019 (1)

Séance (en ligne) du 7 mai 2019 (2)

Séance du 15 mai 2019 (3)

Séance (en ligne) du 21 mai 2019 (4)

Séance du 22 mai 2019 (5)

Séance (en ligne) du 26 mai 2019 (6)

Séance (en ligne) du 28 mai 2019 (7)


1.I. En bref…

Voici un exemple d’ODD prêt à être modifié si nécessaire :

Dans l’exemple ci-dessus, le schéma de spécification <schemaSpec> fait référence à quatre modules qui suivent la valeur de @start “TEI” (c’est-à-dire le module TEI) et identifié par @key : “header”, “core”, “tei” et “textstructure”. On peut compléter chaque <moduleRef> par les @attributs optionnels précédemment énumérés (point 4 ci-dessus).

Lien du wiki de la TEI wiki.tei-c.org.

Complément de lecture :
Bauman, Syd, and Julia Flanders. 2018. Introduction to Writing ODDs
Bauman, Syd, and Julia Flanders. 2010. Element list for ODD.
Lüngen, Harald et C. M. Sperberg-McQueen, 2012. « A TEI P5 Document Grammar for the IDS Text Model », Journal of the Text Encoding Initiative [Online], Issue 3. URL : http://journals.openedition.org/jtei/508 ; DOI : 10.4000/jtei.508

Sommaire ⇪


2.III. Introduction à la structuration d’un schéma TEI en particulier le module [tei].

Qu’est-ce qu’un schéma TEI ?

Un schéma TEI pourrait se résumer ainsi : « […] les conventions élaborées dans le cadre du TEI visent à permettre la description de la manière dont un document a été créé ainsi que la façon dont il a été structuré : pages, paragraphes, lignes, chapitres, dialogues, soulignements, ajouts marginaux, ratures, etc. » (Source : Fabre et Marcotte3)

Il est ainsi impératif de toujours se référer aux classes de modèle pour chaque module.






[3] : Grégory Fabre et Sophie Marcotte. 2014, Pratiques de l’édition numériques, Montréal, Presses de l’Université de Montréal. (ISBN 978-2-7606-3203-5, lire en ligne), chap. 10 (« L’organisation des métadonnées »), p. 175.


3.I. Module [textstructure] : exemple pratique pour un dictionnaire

Les différents <element>s disponibles dans le module [textstructure]


Projet : dictionnaire en ligne pour les 11-13 ans

Voir la carte heuristique XMind du projet.


Exemple d’une entrée pour un lemme de type substantif :

<!-- Toutes les définitions ci-dessous sont empruntées au CNRTL en ligne https://www.cnrtl.fr -->
<entryFree n="1" xml:id="pays-subst">
   <form type="lemma" xml:id="pays-baseF">
      <orth>pays</orth>
      <gramGrp>
        <gram type="pos" value="subst"/>
        <gen value="m"/>      
      </gramGrp>
   </form>
   <form type="inflected">
      <orth sameAs="#pays-baseF"/>
   </form>
   <sense n="1" xml:id="pays-syn-01">
      <def><!-- texte de la définition sense 1 --></def>
      <cit type="example">
        <quote><!-- texte de la citation --></quote>
        <bibl>
           <author n="1">
              <name>Dupont</name>
           </author>
        </bibl>
      </cit>
      <xr type="syn">
        <lbl>Syn. de</lbl>
        <!-- dans le cas où ce lemme a été ajouté au dictionnaire -->
        <ref n="1" target="#terre-sense03">terre</ref>
      </xr>
    </sense>
    <sense n="2" xml:id="pays-syn-02">
      <def><!-- texte de la définition sense 2 --></def>
      <xr type="syn">
        <lbl>Syn. de</lbl>
        <!-- dans le cas où ces deux lemmes ont été ajoutés au dictionnaire -->
        <ref n="1" target="#endroit-sense02">endroit</ref>
        <ref n="2" target="#lieu-sense01">lieu</ref>
      </xr>
    </sense>
</entryFree>

Exemple d’une entrée pour un lemme de type adverbe :

<entryFree n="2" xml:id="lgtps-adv">
   <form type="lemma" xml:id="lgtps-adv-orth">
      <orth>longtemps</orth>
      <gram type="pos" value="adv"/>
   </form>
   <sense n="1" xml:id="lgtps-syn-01">
      <def><!-- texte de la définition sense 1 --></def>
      <xr type="syn">
        <lbl>Syn. de</lbl>
        <!-- dans le cas où ce lemme a été ajouté au dictionnaire -->
        <ref n="1" target="#longuement-sense01">longuement</ref>
      </xr>
   </sense>        
</entryFree>

Exemple d’une entrée pour un lemme de type adjectif :


Exemple d’une entrée pour un lemme de type verbe :

<entryFree n="4" xml:id="partir-verb">
   <form type="lemma" xml:id="partir-baseF">
       <orth>partir</orth>
       <gramGrp>
          <gram type="pos" value="verb"/>
          <mood value="inf"/>
          <subc value="intrans"/>
       </gramGrp>
    </form>
    <sense n="1" xml:id="partir-syn-01">
       <def>
         <ref target="#se-mettre-sense02">Se mettre</ref> en mouvement, <ref target="#quitter-sense01">quitter</ref> un lieu (pour une destination)
       </def>
       <cit type="example">
           <quote>Quand ils agonisent (...) ils vous disent: −Adieu! au revoir, je pars pour un monde meilleur, nous nous retrouverons là-haut!</quote>
           <bibl>
              <author n="1"><name>Borel</name></author>
              <date>1833</date>
              <biblScope unit="p">239</biblScope>
           </bibl>
        </cit>
        <xr type="syn">
          <lbl>Syn. de</lbl>
          <!-- dans le cas où ce lemme a été ajouté au dictionnaire -->
          <ref n="1" target="#quitter-sense01">quitter</ref>
        </xr>
    </sense>  
</entryFree>

Liste des <element>s pour la dictionnaire membre des modules [dictionaries], [analysis] et [core] et entre paranthèse les modèles de classes — classement hiérarchique (la descendance est indiquée par “/” et les <element>s de même niveau par “||”) :

Liste des @attributs par classe d’attributs



Complément de lecture :
Bowers, Jack et Laurent Romary. 2016. « Deep Encoding of Etymological Information in TEI », Journal of the Text Encoding Initiative [Online], Issue 10. URL : http://journals.openedition.org/jtei/1643 ; DOI : 10.4000/jtei.1643.
Budin, Gerhard, Stefan Majewski et Karlheinz Mörth. 2012. « Creating Lexical Resources in TEI P5 », Journal of the Text Encoding Initiative [Online], Issue 3. URL : http://journals.openedition.org/jtei/522 ; DOI : 10.4000/jtei.522.
Mörth, Karlheinz, Laurent Romary, Gerhard Budin et Daniel Schopper. 2015 « Modeling Frequency Data: Methodological Considerations on the Relationship between Dictionaries and Corpora », Journal of the Text Encoding Initiative [Online], Issue 8. URL : http://journals.openedition.org/jtei/1356 ; DOI : 10.4000/jtei.1356.
Romary, Laurant. 2004. Iso and the TEI. When standards speak to standards


[4] cet element a été retenu d’une part pour plus de flexibilité par rapport à entry qui suit un schéma défini, mais surtout parce qu’il autorise 30 <element>s en comparaison avec <entry> qui n’en autorise que 10.


4.I. Arborescence d’un document TEI, brève introduction à XPath.5

Qu’est-ce que XPath ?

Créé en 1999, XML Path Language (abr. XPath) suit les recommandations du W3C ; la version courante est 3.1. XPath est un langage de requête de XSLT ou XML Query Language, abr. XQuery. Il est utilisé dans un fichier XLST (ou XML Pointer Language, abr. XPointer) pour accéder à une partie du contenu, appelé node (fr. nœud) dans un document TEI (ou XML et JSON), selon un chemin (Path) précis. Ce chemin peut être comparé à une relation pour naviguer dans une arborescence ou un arbre généalogique ; il existe deux types de chemins, (1) absolu et (2) relatif.

XPath est indispensable pour manipuler et/ou afficher les informations désirées grâce à XSLT.

Les nœuds :

Un document TEI (XML) contient 7 types de nœuds.

  1. nœud racine
  2. nœuds d’<element>s — contient automatiquement un nom expansé (expanded-name)
  3. nœuds d’@attributs
  4. nœuds de texte
  5. nœuds d’espace de noms (namespace)
  6. nœuds d’instuction de traitement
  7. nœuds commentaire

Les chemins :

Une étape de localisation peut contenir 3 informations, séparées par / : un axe, un nœud de test et 0 ou n prédicats (option).

Les sélecteurs :

Note 1 : l’opérateur de chemin / sert généralement à trouver un node dans une arborescence TEI.
Note 2 : les deux points répétés deux fois :: indique la séparation du chemin des nœuds avec des axes. Toutefois, on peut faire l’économie de :: en utilisant l’opérateur de chemin //child::entryFree/child::w/attribute::lemma <=> /entryFree/w/@lemma

Sémantique et syntaxe

Un chemin dans une arborescence TEI peut schématiquement être symbolisé par un axe sur lequel on se déplace en avant ou en arrière — il se lit de gauche à droite. Le déplacement s’effectue entre le nœud courant (appelé également le nœud contextuel) et les nœuds sélectionnés. L’axe indique la direction à suivre ; il existe 13 axes :

Note : il existe des syntaxes abrégées (voir le cours de Peter Stokes), ex. self::node() = .

Pour aller un peu plus loin, les précisions optionnelles :

Pour aller plus loin, voir la liste des fonctions XPath — critères de sélection : de type sum(), count(), substring(), string-length(), concat(), etc.

Liens utiles


[5] Les exemples ci-dessous seront complétés en fonction des travaux pratiques.


4.II. Module [linking] pour les liens hypertextuels


5.I. Schéma d’entête <teiHeader>

Chapitre du TEI guidelines : The TEI Header
Notez que cet élément est obligatoire.

Pertinence :

<element>s contenus dans le teiHeader

⇾ 7 <element>s : editionStmt | extent | notesStmt | publicationStmt | seriesStmt | sourceDesc | titleStmt


Carte heuristique d’un schéma teiHeader




Déclaration de classification : <taxonomy>

Guidelines TEI


Sa carte heuristique :


Exemple et tutoriel


taxonomie analytique dans le cadre d’une hermeneutique de l’action



5.II. Citations et références bibliographiques

Information dans les TEI guidelines.

5 <element>s principaux appartenant au model.biblLike

Regroupe des <element>s contenant des informations relatives aux descriptions bibliographiques : bibl | biblFull | biblStruc | listBibl | msDesc

Carte heuristique :



A lire: Méthodes d’encodage pour les références bibliographiques et les listes de références

Exemple :



Dans l’exemple ci-dessus, @sortKey (classe att.sortable) permettra de classer les références (sous réserve de la transformation dans XSLT en indiquant le chemin XPath). Voir une brève introduction ci-dessous pour première immersion en XSLT — Peter Stokes reviendra plus en détails sur chacune des fonctions.


5.III. Carte heuristique pour l’encodage d’un manuscrit

Vue générale



Données physiques



Données intellectuelles




6.I. @attributs pour créer une relation entre deux ou plusieurs nœuds

teidata.pointer fournit une URI unique pour pointer vers une donnée interne ou externe au documet.

Propriétés d’un data.pointer :
⇾ il pointe vers quelque chose
⇾ il est formé d’un xml:id NCNames valide

Note au sujet de la validité du “NCNames” : NCNames signifie un “nom non-colonisé” (= nom non-qualifié)6 est une chaîne de caractères dont les symboles suivants sont exclus “@ , $ , % , & , / , + ,,, ;”, ainsi que les espaces et les parenthèses et il ne peut pas commencer par un chiffre, un point ou le signe -.

Liste des 31 classes utilisées par teidata.pointer, classées par [module]

Liste des <element> utilisés par teidata.pointer


[6] A l’inverse du QName qui est un nom qualifié : ns:namens = “namespace” (espace de nom).


6.II. Encodage pour un corpus : <teiCorpus> et primary source

<element>s membre du <teiCorpus> du module [core]

<teiCorpus> peut contenir les <element>s : teiCorpus | teiHeader | fsdDecl | TEI | text | facsimile | sourceDoc

Sélection des <element>s :

Carte heuristique :

Primary sources — module [transcr]

classes d’@attributs


6.III. Brève introduction à XSLT

XSLT est un langage XML, de ce fait il doit respecter le même schéma sémantique. Un fichier XSLT fait automatiquement référence à un document XML ou TEI ; un certain nombre d’instructions sera écrite selon des normes d’encodage rigoureuses (ou des règles sémantiques).

XSL vs XSLT

XSL comprend deux sous-ensembles de transformation eXtensible Stylesheet Language Transformation (abr. “XSLT”) et eXtensible Stylesheet Language Formatting Objects (abr. “XSL-FO”). XSLT permet de transformer un fichier XML ou TEI grâce aux instructions transmises en XSL. Cette transformation permettra d’afficher les données encodées ciblées du fichier TEI (ou XML) — on parle de “moteur” ou de “processor” XSLT ; tandis que l’encodage XSL-FO permet de générer un format de sortie d’un document (PDF par exemple) — qui ne peut être affiché dans un navigateur. Cependant, aujourd’hui XSL-FO est formellement nommé appelé XSL.


Source Premraj dans la conversation What’s the difference between XSLT and XSL-FO?


La syntaxe varie aussi pour donner les instructions :
⇾ de transformation avec XSLT : xsl:ELEMENT
⇾ de formattage avec XSL-FO : fo:INSTRUCTION
⇾ exemple :

<!-- Exemple emprunté http://w3schools.sinsixx.com/xslfo/xslfo_xslt.asp.htm -->
<!-- Instruction de formatage d'un document XML ou TEI en utilisant dans l'exemple ci-dessous une syntaxe identique à CSS -->
<!-- Voir également http://w3schools.sinsixx.com/xslfo/xslfo_blocks.asp.htm -->
<fo:block
    font-size="14pt" font-family="verdana" color="red"
    space-before="5mm" space-after="5mm">
    <!-- element “apply-templates”, on selectionne tous les nœuds XML/TEI dans l'ordre -->
    <xsl:apply-templates/>
</fo:block>

Pour les styles, voir également la discussion Using external CSS in XSL-FO.

Instructions XSLT

A la suite de l’exemple pour les références bibliographiques, voici un exemple d’encodage XSLT.

D’abord le titre de la section dans laquelle les références bibliographiques s’afficheront :

<!-- syntaxe HTML -->
<h2>Linguistics - philology</h2>
<!-- syntaxe XSLT -->
<xsl:apply-templates select="listBibl[@sortKey='linguistics']/bibl">
    <xsl:sort select="author[1]//surname" data-type="text" order="ascending"/>
</xsl:apply-templates>

<xsl:element>s XSL : apply-template | sort

Attributs : select | data-type

⇾ Sélection du XPath de la catégorie à afficher : <listBibl/bibl> dont le @sortKey est “linguistics” dans le doc TEI.
⇾ La première information bibliographique commence par le nom de famille de l’auteur, par ordre alphabétique croissant.

Puis la sélection de chaque type de références. Il est indispensable de donner le chemin pour chaque descendant de <bibl> de sorte que toutes les informations relatives aux références soient affichées :

<!-- aperçu partiel de l'encodage, voir le fichier complet sur GitHub -->
<xsl:template match="listBibl[@sortKey]/bibl">
    <xsl:variable name="referenced-bibl" select="key('bibl', @xml:id)"/>
    <xsl:variable name="bibl" select="$referenced-bibl/string-join(@xml:id, '')"/>
    <xsl:variable name="bibl-author1" as="xs:string*" select="$referenced-bibl/string-join(author[@n='1']/persName/concat(surname, ', ', forename))"/>
    <xsl:variable name="bibl-author2" as="xs:string*" select="$referenced-bibl/string-join((author[@n='2']/persName/concat(forename, ', ', surname), ''))"/>
    <xsl:variable name="bibl-author3" as="xs:string*" select="$referenced-bibl/string-join((author[@n='3']/persName/concat(forename, ', ', surname), ''))"/>
    <xsl:variable name="bibl-date" as="xs:string*" select="$referenced-bibl/string-join((date[1], '. '), '')"/>
    <xsl:variable name="bibl-article" as="xs:string*" select="$referenced-bibl/string-join(title[@level='a'], '')"/>
    <xsl:variable name="bibl-journal" as="xs:string*" select="$referenced-bibl/string-join(title[@level='j'], '')"/>
    <xsl:variable name="bibl-book-m" as="xs:string*" select="$referenced-bibl/string-join(title[@level='m'],'')"/>
    <xsl:variable name="bibl-book-s" as="xs:string*" select="$referenced-bibl/string-join(title[@level='s'],'')"/>
    <xsl:variable name="bibl-editor" as="xs:string*" select="$referenced-bibl/string-join(descendant-or-self::bibl[@xml:id]/editor[@n]/persName/concat(substring(forename, 1, 1), '. ', surname), ', ')"/>
    <xsl:variable name="bibl-biblScope-page" as="xs:string*" select="$referenced-bibl/string-join(biblScope[@unit='page'], '')"/>
    <xsl:variable name="bibl-biblScope-pp" as="xs:string*" select="$referenced-bibl/string-join(biblScope[@unit='pp'], '')"/>
    <xsl:variable name="bibl-biblScope-issue" as="xs:string*" select="$referenced-bibl/string-join(biblScope[@unit='issue'], '.')"/>
    <xsl:variable name="bibl-publisher" as="xs:string*" select="$referenced-bibl/string-join((publisher, '. '), '')"/>
    <xsl:variable name="bibl-idno" as="xs:string*" select="$referenced-bibl/string-join((idno, '.'), '')"/>
    <xsl:variable name="bibl-h-ref" as="xs:string*" select="$referenced-bibl/string-join(child::ref/@target, ', ')"/>
    <xsl:variable name="bibl-ref-date" as="xs:string*" select="$referenced-bibl/string-join(date[@when], '. ')"/>

Sélection du contenu à afficher

Généralement, on affiche que partiellement le contenu des données saisies dans un document TEI. Des règles sémantiques seront alors utilisées.

<xsl:element>s XSL : template | variable


Note : Depuis XPath 2.0, <XSLT> peut contenir des fonctions (communes à XSLT 2.0 et xQuery 1.0) fn:NOM DE LA FONCTION — voir la dernière mise à jour des fonctions “XPath and XQuery Functions and Operators 3.1” :
accesseur | erreur et Trace | numérique | chaîne | anyURI | boolean | durée, Date, Heure | QName | nœud | séquence | contexte — source en français.

Conventionnellement, dans un document de transformation XSL, l’expression fn: n’est pas nécessaire.

Affichage dans un navigateur :

Liens utiles


7.I. Module [namesdates] pour les noms, dates, personnes et lieux géographiques

En détail : type de données et classe d’@ttributs


7.II. Brève introduction aux expressions régulières (REGEX)


Vanessa Bigot Juloux (EPHE-PSL, Andrews University)